package com.itdfq;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Author: GodChin
 * @Date: 2021/8/16 15:36
 * @Blog: itdfq.com
 * @QQ: 909256107
 * @Description: Class类的方法
 * <p>
 * 　　getName()：获得类的完整名字。
 * 　　getFields()：获得类的public类型的属性。
 * 　　getDeclaredFields()：获得类的所有属性。包括private 声明的和继承类
 * 　　getMethods()：获得类的public类型的方法。
 * 　　getDeclaredMethods()：获得类的所有方法。包括private 声明的和继承类
 * 　　getMethod(String name, Class[] parameterTypes)：获得类的特定方法，name参数指定方法的名字，parameterTypes 参数指定方法的参数类型。
 * 　　getConstructors()：获得类的public类型的构造方法。
 * 　　getConstructor(Class[] parameterTypes)：获得类的特定构造方法，parameterTypes 参数指定构造方法的参数类型。
 * 　　newInstance()：通过类的不带参数的构造方法创建这个类的一个对象。
 */

public class ClassMethod {
    public static void main(String[] args) throws NoSuchFieldException, InstantiationException, IllegalAccessException {
        Class c2 = Person.class;
        //获得类完整的名字
        String className = c2.getName();
        System.out.println(className);//输出com.itdfq.reflex.Person

//获得类的public类型的属性。
        Field[] fields = c2.getFields();
        for(Field field : fields){
            System.out.println(field.getName());//age
        }

//获得类的所有属性。包括私有的
        Field [] allFields = c2.getDeclaredFields();
        for(Field field : allFields){
            System.out.println(field.getName());//name    age
        }

//获得类的public类型的方法。这里包括 Object 类的一些方法
        Method[] methods = c2.getMethods();
        for(Method method : methods){
            System.out.println(method.getName());//work waid equls toString hashCode等
        }

//获得类的所有方法。
        Method [] allMethods = c2.getDeclaredMethods();
        for(Method method : allMethods){
            System.out.println(method.getName());//work say
        }

//获得指定的属性
        Field f1 = c2.getField("age");
        System.out.println(f1);
//获得指定的私有属性
        Field f2 = c2.getDeclaredField("name");
//启用和禁用访问安全检查的开关，值为 true，则表示反射的对象在使用时应该取消 java 语言的访问检查；反之不取消
        f2.setAccessible(true);
        System.out.println(f2);

//创建这个类的一个对象
        Object p2 =  c2.newInstance();
//将 p2 对象的  f2 属性赋值为 Bob，f2 属性即为 私有属性 name
        f2.set(p2,"Bob");
//使用反射机制可以打破封装性，导致了java对象的属性不安全。
        System.out.println(f2.get(p2)); //Bob

//获取构造方法
        Constructor[] constructors = c2.getConstructors();
        for(Constructor constructor : constructors){
            System.out.println(constructor.toString());//public com.ys.reflex.Person()
        }

         


    }
}
